package validador;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;


public class ReglaCompuesta implements Regla {
	protected Boolean resultado;
	protected List<Regla> reglasHijas = new ArrayList<Regla>();
	protected Operador operador = null;

	public Operador getOperador() {
		return operador;
	}

	public void setOperador(Operador operador) {
		this.operador = operador;
	}

	/**
	 * @return the reglasHijas
	 */
	public Collection<Regla> getReglasHijas() {
		return reglasHijas;
	}

	/**
	 * @param reglasHijas
	 *            the reglasHijas to set
	 */
	public void setReglasHijas(List<Regla> reglasHijas) {
		this.reglasHijas = reglasHijas;
	}

	@Override
	public Boolean esValida(Object entrada) {
		Boolean resultadoValidacion = new Boolean(false);
		List<Boolean> listaResultadoHijos = new ArrayList<Boolean>();

		for (Iterator<Regla> iterator = this.reglasHijas.iterator(); iterator
				.hasNext();) {
			Regla reglaHija = (Regla) iterator.next();
			Boolean resultadoHijo = new Boolean(false);

			Boolean reglaHijaTieneHijos = reglaHija.getHijos() != null;

			if (reglaHijaTieneHijos) {
				resultadoHijo = reglaHija.esValida(entrada);
			} else {
				Modo modo = (Modo) entrada;

				for (Iterator<Object> iteradorObjetosEntrada = modo
						.iterator(); iteradorObjetosEntrada.hasNext()
						&& resultadoHijo.equals(false);) {
					Object objetoEntrada = (Object) iteradorObjetosEntrada
							.next();
					resultadoHijo = reglaHija.esValida(objetoEntrada);
				}
			}

			listaResultadoHijos.add(resultadoHijo);
		}

		resultadoValidacion = this.getOperador().operar(listaResultadoHijos);

		return resultadoValidacion;
	}

	@Override
	public List<Regla> getHijos() {
		return this.reglasHijas;
	}

}
